name: Main Kittygram workflow

on:
  push:
    branches:
      - main

jobs:
  tests:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:13.10
        env:
          POSTGRES_USER: kittygram_user
          POSTGRES_PASSWORD: kittygram_password
          POSTGRES_DB: kittygram
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.9

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip 
        pip install flake8==6.0.0 flake8-isort==6.0.0
        pip install -r ./backend/requirements.txt 
    - name: Test with flake8 and django tests
      env:
        POSTGRES_USER: kittygram_user
        POSTGRES_PASSWORD: kittygram_password
        POSTGRES_DB: kittygram
        DB_HOST: 127.0.0.1
        DB_PORT: 5432
      run: |
        python -m flake8 backend/
        cd backend/
        python manage.py test
  build_and_push_to_docker_hub:
    name: Push Docker image to DockerHub
    runs-on: ubuntu-latest
    needs: tests
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to Docker 
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }} 
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Push to DockerHub
        uses: docker/build-push-action@v4
        with:
          context: ./backend/
          push: true
          tags: izida/kittygram_backend:latest
  frontend_tests:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up nodeJS
      uses: actions/setup-node@v3
      with:
        node-version: 18

    - name: Install dependencies
      run: |
        cd frontend/
        npm ci

    - name: Test frontend
      run: |
        cd frontend/
        npm run test
  build_frontend_and_push_to_docker_hub:
    name: Push frontend Docker image to DockerHub
    runs-on: ubuntu-latest
    needs: frontend_tests
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to Docker 
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Push to DockerHub
        uses: docker/build-push-action@v4
        with:
          context: ./frontend/
          push: true
          tags: izida/kittygram_frontend:latest
  build_gateway_and_push_to_docker_hub:
    name: Push gateway Docker image to DockerHub
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to Docker 
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Push to DockerHub
        uses: docker/build-push-action@v4
        with:
          context: ./nginx/
          push: true
          tags: izida/kittygram_nginx:latest
  deploy:
    runs-on: ubuntu-latest
    needs:
      - build_and_push_to_docker_hub
      - build_frontend_and_push_to_docker_hub
      - build_gateway_and_push_to_docker_hub
    steps:
    - name: Checkout repo
      uses: actions/checkout@v3
    - name: Copy docker-compose.yml via ssh
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USER }}
        key: ${{ secrets.SSH_KEY }}
        passphrase: ${{ secrets.SSH_PASSPHRASE }}
        source: "docker-compose.production.yml"
        target: "kittygram"
    - name: Executing remote ssh commands to deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USER }}
        key: ${{ secrets.SSH_KEY }}
        passphrase: ${{ secrets.SSH_PASSPHRASE }}
        script: |
          cd kittygram
          # Выполняет pull образов с Docker Hub
          sudo docker compose -f docker-compose.production.yml pull
          # Перезапускает все контейнеры в Docker Compose
          sudo docker compose -f docker-compose.production.yml down
          sudo docker compose -f docker-compose.production.yml up -d
          # Выполняет миграции и сбор статики
          sudo docker compose -f docker-compose.production.yml exec backend python manage.py migrate
          sudo docker compose -f docker-compose.production.yml exec backend python manage.py collectstatic
          sudo docker compose -f docker-compose.production.yml exec backend cp -r /app/collected_static/. /static/static/
  send_message:
    runs-on: ubuntu-latest
    needs: deploy
    steps:
    - name: Send message
      uses: appleboy/telegram-action@master
      with:
        to: ${{ secrets.TELEGRAM_TO }}
        token: ${{ secrets.TELEGRAM_TOKEN }}
        message: Deploy Kittygram is done
